/************************************************************************
  Scheme interpreter
  
  Copyright (C) 2010 Marioly Garza 

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Lesser General Public License as
  published by the Free Software Foundation, either version 3 of the
  License, or (at your option) any later version.
  
  This program is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this program. If not, see
  <http://www.gnu.org/licenses/>.

************************************************************************/

#include "closure.h"
#include "scheme.h"

int closure::instances(0);

closure::closure(object* args, object* code, environment* env) : procedure("", code, env)
{
    this->args = args;
    this->id += instances;
    memoized = false;
    instances++;
}

object* closure::invoke(std::list<object*> args, environment* env)
{
    // if (!memoized)
    // {
    std::list<object*> vars = scheme::va_list((pair*)this->args, env, false);
    environment* nenv = new environment(vars, args, env);
    object* ret = scheme::evaluate(code, nenv);
    memoized = true;
    delete nenv;
    //}

    return ret;
}
